A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given:

1/2  = 0.5
1/3  = 0.(3)
1/4  = 0.25
1/5  = 0.2
1/6  = 0.1(6)
1/7  = 0.(142857)
1/8  = 0.125
1/9  = 0.(1)
1/10 = 0.1

Where 0.1(6) means 0.166666..., and has a 1-digit recurring cycle. It can be seen that 1/7 has a 6-digit recurring cycle.

Find the value of d < 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.


In [1]:
open System.Collections.Generic

let rec maxPatternLength' num den pos (remainders:IDictionary<int,int>) = 
    let rem = num % den
    if remainders.ContainsKey(rem) then
        pos - remainders.[rem]
    else
        remainders.Add(rem, pos)
        maxPatternLength' (10 * rem) den (1 + pos) remainders

let maxPatternLength n =
    maxPatternLength' 1 n 0 (new Dictionary<int, int>())

[2..1000]
|> List.map (fun n -> (n, (maxPatternLength n)))
|> List.sortBy (fun (n, patternLength) -> patternLength)
|> List.last
|> fst
|> printfn "%A"


983

In [ ]: